package com.simple.database.pageprocess;

import java.text.ParseException;
import java.time.Instant;
import java.util.List;
import java.util.TreeSet;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.LongAdder;

import org.apache.commons.collections.CollectionUtils;
import org.apache.ibatis.session.AutoMappingBehavior;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.JsonPathSelector;

/**
 * 思路：
 * 	1、找到列表页的ajax请求路径
 *  2、获取列表路径请求的数据，用JsonPathSelector获取json中的数据集
 *  3、从数据集中获取文章id，拼接链接得每篇文章的详情页链接
 *  4、从详情页链接中获取数据，用JsonPathSelector抽取所需数据
 */
public class AjaxPageProcess implements PageProcessor {

	private Site site = Site.me();

	//详情页链接
//	private static final String ARITICALE_URL = "http://angularjs\\.cn/api/article/\\w+";

	//列表页ajax请求路径
	private static final String LIST_URL = "http://angularjs\\.cn/api/article/latest.*";

	@Override
	public void process(Page page) {
		if (page.getUrl().regex(LIST_URL).match()) {
			System.out.println(page.getRawText());
			//获取列表页数据id
			List<String> ids = new JsonPathSelector("$.data[*]._id")
					.selectList(page.getRawText());
			if (CollectionUtils.isNotEmpty(ids)) {
				for (String id : ids) {
					page.addTargetRequest("http://angularjs.cn/api/article/"
							+ id);
				}
			}
		} else {
			System.out.println("文章详情："+page.getRawText());
			page.putField("title", new JsonPathSelector("$.data.title")
					.select(page.getRawText()));
		}
	}

	@Override
	public Site getSite() {
		return site;
	}

	public static void main(String[] args) throws ParseException {
//		 Spider.create(new
//		 AjaxPageProcess()).addUrl("http://angularjs.cn/api/article/latest?p=2&s=20").run();
	/*	String data = "{'ack':true,'error':null,'timestamp':1493208094561,'data':[{'_id':'A2Ig','author':{'_id':'Uadmio','name':'angularjs','avatar':'http://www.gravatar.com/avatar/f62542400b7f9d217fd0d8b463ded42f','score':'67070'},'date':1486099462613,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'2017年的 Google IO 大会现在开始报名！','cover':'','content':'大家好！ \n\n请大家关注一下我在全国社区论坛发出的通知：\nhttp://www.chinagdg.com/forum.php?mod=viewthread&tid=32878&extra=page%3D1\n\n请你们大家跟进一下以下事项：\n\n请告诉你们的社区这个重要通知，并动员你们社区中任何人有兴趣自费去参会的，尽快早点报名，务必在截至日期2/19日之前完成。\n\n你们各个社区的组织者们，不管是…','hots':289,'visitors':1431,'updateTime':1486369850011,'tagsList':[{'_id':'T001','tag':'AngularJS','articles':301,'users':48}],'comments':1},{'_id':'A2Ib','author':{'_id':'Uadvbj','name':'flyrocketing','avatar':'http://www.gravatar.com/avatar/6a77c4f14e5af76e05a498dfe81217a9','score':'1335'},'date':1485065927648,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'angular2 视频学习资料更新啦','cover':'','content':'春节期间将进行视频更新，欢迎欣赏学习。\n\nPC推广链接：http://android.myapp.com/myapp/detail.htm?apkName=io.ionic.starter\n\n移动推广链接（微下载能力）：http://a.app.qq.com/o/simple.jsp?pkgname=io.ionic.starter','hots':1274,'visitors':6286,'updateTime':1489138867417,'tagsList':[{'_id':'T09D','tag':'angular2','articles':0,'users':0}],'comments':5},{'_id':'A2Ia','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1484810401381,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'2017年App开发趋势介绍详解（建议收藏）','cover':'','content':'2017 年的开年，朋友圈先被一圈小程序的新闻刷爆了。小程序未出之前，许多媒体声称这将颠覆App。可是小程序推出之后，媒体的声音不像之前那样一边倒了。App开发人员估计还要继续忙碌下去，因为整个App开发行业的创新依然保持着非常强劲的增长势头，而对于很多企业而言，移动营销策略也会显得愈发重要。\n\n身处…','hots':810,'visitors':3973,'updateTime':1492596548684,'tagsList':[{'_id':'T0by','tag':'apicloud','articles':0,'users':0}],'comments':1},{'_id':'A2I9','author':{'_id':'Uaeehr','name':'stromkaka','avatar':'http://www.gravatar.com/avatar/dc1ffb45436cfde30ef131fa95124373','score':'133'},'date':1484809866999,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'关于在angular2 中使用canvas来画图','cover':'','content':'请问angular2 里面支持canvas么，我写的各种报错。。。。。','hots':520,'visitors':2570,'updateTime':1487487535466,'tagsList':[{'_id':'T001','tag':'AngularJS','articles':301,'users':48},{'_id':'T007','tag':'问题与建议','articles':78,'users':4},{'_id':'T008','tag':'AngularJS 开发指南','articles':66,'users':15},{'_id':'T009','tag':'AngularJS 文档资讯','articles':11,'users':7}],'comments':1},{'_id':'A2I5','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1484637779010,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'2016年终总结下：坚持52次版本更新，为提高开发者体验','cover':'','content':'2016年对于APICloud来说，是增长的一年，更是收获的一年。这一年里，APICloud的产品经历了两次巨大更新和升级，为原生开发者带来了全新的产品SuperWebview，为传统企业和互联网公司解决App定制难题。APICloud从移动应用开发专家蜕变、升级至移动应用开发+定制的良性生态系统。\n\n接下来的时间，APICloud将从6个方面梳理2016…','hots':426,'visitors':2106,'updateTime':1484637811238,'tagsList':[{'_id':'T0by','tag':'apicloud','articles':0,'users':0}],'comments':0},{'_id':'A2I4','author':{'_id':'Uadmio','name':'angularjs','avatar':'http://www.gravatar.com/avatar/f62542400b7f9d217fd0d8b463ded42f','score':'67070'},'date':1484451055862,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'Angular集成开发环境虚拟机','cover':'','content':'我听说有很多初学者在搭建angular开发环境方面还存在困难，特别是选择使用angular-cli的朋友。\n\n于是，我花了几十个小时拿Ubuntu 16.04做了一个VMware镜像，开发环境都搭好了，包括git/nodejs/angular-cli。\n\nVMware镜像百度网盘链接：https://pan.baidu.com/s/1pLlR4Rx\n\n在VMware里面导入虚拟机ova文件之后，启动Ubuntu。\n\n系统的用户名/密码…','hots':449,'visitors':2218,'updateTime':1484451055862,'tagsList':[{'_id':'T0bB','tag':'AngularAngular2','articles':0,'users':0}],'comments':0},{'_id':'A2I3','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1484381752493,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'【2016年终总结中】凝聚365天的移动应用开发技术精华','cover':'','content':'2016年对于APICloud来说是增长的一年更是收获的一年。这一年里APICloud的产品经历了两次巨大更新和升级为原生开发者带来了全新的产品SuperWebview为传统企业和互联网公司解决App定制难题。APICloud从移动应用开发专家蜕变、升级至移动应用开发+定制的良性生态系统。\n\n接下来的时间APICloud将从6个方面梳理2016年的过往敬请…','hots':311,'visitors':1532,'updateTime':1484381752493,'tagsList':[],'comments':0},{'_id':'A2I2','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1484303694814,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'【2016年终总结上】有关40万移动应用开发者的未来','cover':'','content':'2016年对于APICloud来说，是增长的一年，更是收获的一年。这一年里，APICloud的产品经历了两次巨大更新和升级，为原生开发者带来了全新的产品SuperWebview，为传统企业和互联网公司解决App定制难题。APICloud从移动应用开发专家蜕变、升级至移动应用开发+定制的良性生态系统。接下来的时间，APICloud将从6个方面梳理2016…','hots':237,'visitors':1129,'updateTime':1486122730968,'tagsList':[{'_id':'T0by','tag':'apicloud','articles':0,'users':0}],'comments':2},{'_id':'A2HW','author':{'_id':'Uaeawb','name':'sctoss','avatar':'http://www.gravatar.com/avatar/40c3400219004073f2dd8bc715b22c6b','score':'480'},'date':1484027307478,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'前端工程师一枚（angular, react），求兼职工作，QQ:34457479','cover':'','content':'5nian前端工程师一枚（angular, react），求兼职工作，QQ:34457479','hots':544,'visitors':2693,'updateTime':1484027307478,'tagsList':[],'comments':0},{'_id':'A2HU','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1483684421689,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'后移动互联网时代：到底还要不要开发一个App？','cover':'','content':'**后移动互联网时代，到底是什么样的一个时代？**\n\t\n首先，后移动互联网时代中，产生头部应用的几率变小了，像微信这样巨头式的App很难在产生第二个。其次，后移动互联网时代，物联网发展迅速，所有的智能硬件都需要一个移动应用去控制，那么App作为物联网中的软件端（与硬件相对应），将成为最重要的载体。…','hots':410,'visitors':2027,'updateTime':1483684421689,'tagsList':[],'comments':0},{'_id':'A2HS','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1483512310675,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'选择App开发外包时，你该了解哪些法律常识？','cover':'','content':'随着App需求的激增，选择App外包服务的客户也多了起来。然而客户和开发方对于其中的法律条款却不甚了解，导致在服务过程中，时常会发生一些分歧和纠纷，最终致使项目搁浅。\n\n为了普及App外包的法律常识，移动应用开发平台APICloud联合快法务，带来了一场App开发：技术+法律的活动。快法务的联合创始人王律师详…','hots':281,'visitors':1381,'updateTime':1483512335972,'tagsList':[{'_id':'T0bP','tag':'app外包','articles':0,'users':0}],'comments':0},{'_id':'A2HN','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1482996635204,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'张小龙首次解读小程序，遭遇“神预测”？','cover':'','content':'今天，张小龙在微信公开课PRO的会场上向公众透露了更多有关“小程序”的信息，将这款产品的神秘面纱又揭开了一角。\n\n由于深耕移动互联网多年，专注研究HTML5技术的发展演变、App开发技术的迭代、以及不同移动终端背后的业务逻辑和使用场景，APICloud CEO刘鑫一直非常关注小程序的动态，他从几个月前就开始在各类…','hots':577,'visitors':2840,'updateTime':1482996635204,'tagsList':[{'_id':'T0bN','tag':'HTML5 小程序 张小龙 …','articles':0,'users':0}],'comments':1},{'_id':'A2HL','author':{'_id':'Uaecmy','name':'momoda','avatar':'http://www.gravatar.com/avatar/f0e6c8a42d25a07726e6f0c508d35f44','score':'412'},'date':1482896775435,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'优惠主机分享：恒创跨年促销，主机/云服务器/独立服务器买就送','cover':'','content':'错过双11、双12主机活动的朋友，福利来了。\n恒创科技2017跨年促销马上开始，这次活动力度大，优惠多，国内/香港/韩国/美国所有节点，虚拟主机/云服务器/独立服务器所有产品，新购/续费买就送，满390元送小米VR眼镜，还可以免费抽奖，蓝牙耳机、小米充电宝等等。\n\n ![enter image description here][1]\n\n活动地址：[http://www.he…','hots':184,'visitors':888,'updateTime':1483066987645,'tagsList':[],'comments':2},{'_id':'A2HJ','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1482827099902,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'Webstorm功能详解及插件推荐','cover':'','content':'Web前端开发神器——Webstorm不用多介绍，强大的智能提示只是它的一个功能特性，它还具有许多有用的特性，比如版本控制、本地历史、即时模板等。Webstorm还内置了对 SASS、NodeJS、CoffeeScript、Jade 的支持，并且可自定义代码格式化规则。\n\n### **Webstorm有哪些优势？**\n\n1、        图片宽高提示\n![enter image description here][1]\n\n平…','hots':528,'visitors':2617,'updateTime':1482827099902,'tagsList':[{'_id':'T0bM','tag':'AngularJS；APICloud','articles':0,'users':0}],'comments':0},{'_id':'A2HG','author':{'_id':'Uaebbw','name':'angular_sc_cd','avatar':'http://sports.sohu.com/upload/nbalogo/thunder.jpg','score':'1187'},'date':1482401237953,'display':0,'status':0,'refer':{'_id':null,'url':'http://www.jianshu.com/p/c9af360f54b3'},'title':'GDD大会Angular2优秀项目案例——任意门前端技术探秘','cover':'','content':'移座：http://www.jianshu.com/p/c9af360f54b3','hots':762,'visitors':3680,'updateTime':1486525194241,'tagsList':[{'_id':'T001','tag':'AngularJS','articles':301,'users':48},{'_id':'T008','tag':'AngularJS 开发指南','articles':66,'users':15},{'_id':'T006','tag':'AngularJS 入门教程','articles':36,'users':12}],'comments':7},{'_id':'A2HF','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1482388138310,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'Sublime、Webstorm等在APICloud平台上全面支持WiFi真机同步和实时预览功能','cover':'','content':'APICloud工具插件包括APICloud Studio、Sublime Text和Webstorm全面为开发者提供iOS和Android平台真机同步调试功能，不仅可以通过USB方式进行APP真机同步功能，更新增WiFi真机同步和WiFi真机实时预览两大功能，方便开发者在开发过程中进行真机预览和调试，加快同步的速度和提高预览调试的效率。使用这三种工具插件中的WiFi真机…','hots':260,'visitors':1260,'updateTime':1493114378624,'tagsList':[{'_id':'T0by','tag':'apicloud','articles':0,'users':0}],'comments':1},{'_id':'A2HE','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1482225672406,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'Sublime WiFi真机同步和WiFi真机预览使用说明','cover':'','content':'**概述**\n\n**WiFi真机同步：** 通过在Sublime中建立调试服务，接收真机设备主动连接调试的方式，配合apploader及自定义loader，为开发者提供在局域网内通过WiFi实现应用快速真机同步和实时预览的服务，摆脱应用开发调试过程中，真机同步时必须依赖USB数据线的困扰，完美解决了USB数据线真机同步方式存在的各种问题，具…','hots':248,'visitors':1211,'updateTime':1492683781988,'tagsList':[{'_id':'T0bL','tag':'apicloudsublime','articles':0,'users':0}],'comments':2},{'_id':'A2HA','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1481785141287,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'Sublime、Webstorm，还有CLI、Atom，这些开发工具的更新你清楚吗？','cover':'','content':'APICloud App开发平台一直在不断升级开发工具库，这一年增加了众多开发工具。目的就是让开发者可以选择使用任何自己喜欢的HTML5开发工具去开发App。\n\n那么2016年到现在，这些开发工具都有了哪些更新和升级呢？\n\n**1.\tAPICloud Studio中支持可视化AUI控件插入**\n\n开发者选择UI模板后，一键插入正在编辑的代码中，APICloud Studi…','hots':419,'visitors':2096,'updateTime':1481785141287,'tagsList':[{'_id':'T0by','tag':'apicloud','articles':0,'users':0}],'comments':0},{'_id':'A2Hw','author':{'_id':'Uadwim','name':'were1234','avatar':'http://www.gravatar.com/avatar/68d5fe597ac3eeed509512353f0858bf','score':'4088'},'date':1481614046602,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'你知道吗？使用任何HTML5开发工具都可开发iOS、Android原生App','cover':'','content':'APICloud App开发平台一直在不断升级开发工具库，这一年增加了众多开发工具。目的就是让开发者可以选择使用任何自己喜欢的HTML5开发工具去开发App。\n\n这次，APICloud把所有关于开发工具的升级做了统一的整理，这样开发者更清楚APICloud都支持哪些开发工具。\n\n![enter image description here][1]\n\n**1.        Sublime APICloud Plugins**\n\nSubli…','hots':591,'visitors':2940,'updateTime':1492596518773,'tagsList':[{'_id':'T0by','tag':'apicloud','articles':0,'users':0}],'comments':1},{'_id':'A2Hp','author':{'_id':'Uaeefj','name':'yangfangfang','avatar':'http://www.gravatar.com/avatar/432206bb2aa43b5706caafb8df403a05','score':'108'},'date':1481265431940,'display':0,'status':0,'refer':{'_id':null,'url':''},'title':'关于ng-repeat处理大宽表性能问题','cover':'','content':'目前用到angularjs展现数据条数多、列数多的情况下，页面性能差的问题，有什么好的处理方案呢？','hots':479,'visitors':2342,'updateTime':1482735980672,'tagsList':[{'_id':'T0bF','tag':'ng-repeat 性能差','articles':0,'users':0}],'comments':3}],'pagination':{'total':2161,'pageSize':20,'pageIndex':2}}";
		JsonPathSelector jps = new JsonPathSelector("$.message");
		List<String> selectList = jps.selectList(data);
		for (String id : selectList) {
			System.out.println(id);
		}*/
		/*String data ="{'message':'success','code':'200','result':[{'id':23,'url':'http://www.baidu.com','title':'百度一下'},{'id':2,'url':'http://www.google.com','title':'谷歌搜索'}]}";
		List<String> list = new JsonPathSelector("$.result[*].url").selectList(data);
		for (String str : list) {
			System.out.println(str);
		}*/
//		ScheduledExecutorService s = new ScheduledThreadPoolExecutor(3);
//		Date date = new Date();
//		Date addDays = DateUtils.parseDate("2017-04-27 16:07:44", "yyyy-MM-dd HH:mm:ss");
//		System.out.println(addDays);
//		TreeSet<Integer> list = new TreeSet<Integer>();
//		for (int i = 0; i < 10; i++) {
//			Integer nextInt = ThreadLocalRandom.current().nextInt(10)+1;
//			list.add(nextInt);
//		}
//		System.out.println(list);
//		AtomicInteger ai = new AtomicInteger();
//		ai.addAndGet(1);
//		LongAdder adder = new LongAdder();
//		adder.add(1L);
	}
}







